#! /usr/bin/env python
# -*- coding:utf-8 -*-
import datetime
import logging
import os, sys
logging.basicConfig(level=logging.DEBUG, #日志级别为DEBUG
                    format="%(asctime)s %(pathname)s %(levelname)s %(lineno)d %(message)s", #日志格式设置
                    datefmt = '%Y-%m-%d  %H:%M:%S %a',    #日期格式设置
                    filename = os.getcwd()+'/common/logging.log')  #日志输入文件地址
cur_path = os.getcwd()
sys.path.append(cur_path)
import model_regression as rm
import model_strategic as sa
from mysql_conn import Session
import load_info as load
import utils_data as util
import model_condition as sc
"""
外部调用能量、电量 训练、预测脚本
主要功能：
        训练能量模型
        预测能量值及策略
        训练电量模型
        预测电量值
结构：
    class manual
        def do_test   #预测能量或电量
        def do_train  #训练能量或电量模型
    def main 执行函数
运行方式：直接运行main()
前置条件：参数中输入的数据集真实存在并且是utf-8格式
         预测模式下有对应的模型文件
"""
class manual:
    """
    能量电量模型 实现训练预测功能
    """
    def __init__(self,model_id,data_path):
        self.today = datetime.datetime.now()     #今天
        self.model_id = int(model_id)            #model表的id
        ld = load.Device_load()
        self.model_path,self.dev_code = ld.load_model_info(self.model_id)["model_path"].values[0],ld.load_model_info(self.model_id)["device_code"].values[0] #模型信息
        self.data_path = data_path         #数据集地址全路径
    #数据预测模式
    def do_test(self):
        """
        能量或电量值预测
        :return: pre_data:df,预测结果
        """
        #预测
        reg = rm.model_xgboost( self.model_path, self.data_path,self.dev_code)  # 加载模型类
        pre_data = reg.xgb_predict()
        #生成预测结果输出文件地址
        pre_path = os.getcwd() + r"/predict/predict_%s/%s.csv" % ( self.dev_code, self.today.strftime("%Y%m%d_%H%M%S"))#预测结果输出地址
        if not os.path.exists(os.path.abspath(os.path.join(pre_path, ".."))):
            os.mkdir(os.path.abspath(os.path.join(pre_path, "..")))
        #输出预测结果
        pre_data.to_csv(pre_path, encoding="utf-8", index=False)
        return pre_data
    #数据训练模式
    def do_train(self):
        """
        能量电量模型训练并更新model表中模型status状态为1
        """
        #训练
        reg = rm.model_xgboost(self.model_path, self.data_path, self.dev_code)  # 加载模型类
        pre_data = reg.xgb_train()
        logging.info("progress train 1/2 --> train down !")
        #将模型中对应id的status改为1
        with Session() as session:
            insert1 = 'UPDATE model SET status=1 WHERE id=%s'
            session.change(insert1, self.model_id)
            insert2 = 'UPDATE model SET create_time=%s WHERE id=%s'
            session.change(insert2, [datetime.datetime.now().strftime("%Y%m%d%H%M%S"),self.model_id])
            logging.info("progress train 2/2 --> change model status and  create_time down !")

#主函数
def main(model_id,type,data_path,stgy_type):
    """
    调用主函数,含训练/预测两个个功能
    :param model_id: model表中的id,int
    :param type:     运行的功能,str,train-训练;test-测试
    :param data_path:  数据集文件全路径,str
    """
    print("data_path:",data_path)
    logging.info("Start on %s!", datetime.datetime.now().hour)
    er = manual(model_id,data_path)
    if type =='train': #训练模式
        er.do_train()
    else: #预测模式
        to = util.To_database()
        pre_data = er.do_test() #预测
        to.to_pre_data_day(er.dev_code, pre_data,int(model_id)) #预测结果写入数据库
        logging.info("progress test 1/2 --> to_pre_data_day down !")
        ld = load.Device_load()
        station_ene_code = ld.load_station_info()["energy_code"]
        #如果预测能量模式,继续预测能量对应的策略
        if er.dev_code == station_ene_code:
            counts = pre_data.shape[0]  #总预测数
            count = 0
            for _, row in pre_data.iterrows():
                date = datetime.datetime(int(row["sdate"].split("-")[0]),int(row["sdate"].split("-")[1]),int(row["sdate"].split("-")[2]))
                lg = load.Graph_load()
                lg.put_databydate(date)
                # stgy_type = lg.load_strategy_type(int(lg.graph_id)) #当按图谱计算stgy_type时
                relation_list = util.Device_util(int(lg.graph_id), date,stgy_type).relation_split()
                if len(relation_list[0]):  #若工况表非空（过渡季），进行预测
                    sm = sa.Strategic_model(row["data"],date)
                    res = sm.strate_model()
                    res_dict = sm.strate_format(res)  # 执行策略模型的主函数
                    if len(relation_list[1]):  # 若工况表非空（过渡季），进行预测
                        ##固定策略
                        relation = sc.RelationCondition(date)  # 加载固定工况计算类
                        res = relation.get_data()  # 预测的固定工况字典
                        res_dict.update(res)
                    new_list,_ = util.Device_util(int(lg.graph_id),None,stgy_type).strategy_to_list_mean(res_dict, model_id, date)
                    new_list = [i[:-1] for i in new_list]
                    to.to_pre_strategy(new_list,date,int(model_id),stgy_type) #策略写入temp表
                else:
                    if len(relation_list[1]):  # 若工况表非空（过渡季），进行预测
                        ##固定策略
                        relation = sc.RelationCondition(date)  # 加载固定工况计算类
                        res = relation.get_data()  # 预测的固定工况字典
                        new_list,_ = util.Device_util(int(lg.graph_id),None,stgy_type).strategy_to_list_mean(res, model_id, date)
                        new_list = [i[:-1] for i in new_list]
                        to.to_pre_strategy(new_list, date, int(model_id),stgy_type)  # 固定策略写入temp表
                    else:
                        #生成无策略建议工况，入库
                        strat_list = [[date.replace(hour=0, minute=0, second=0, microsecond=0),
                                       date.replace(hour=23, minute=59, second=59, microsecond=0), 0, 0, 0, '无策略建议',
                                       lg.graph_id,
                                       stgy_type, int(model_id)]]
                        to.to_pre_strategy(strat_list,date,int(model_id),stgy_type) #策略写入temp表
                        print("--2  to_pre_strat")

                logging.info("Finish down!")
                count+=1
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################")
                print("PY-EXECUTE-PROCESS:%s" % (round(count / counts, 1) * 100), "%")
        logging.info("progress test 2/2 --> to_pre_strategy down !")

if __name__ =="__main__":
    """
    外部调用的能量或电量预测主运行文件
    """
    ##测试
    # main(57,"train",r"C:\Users\ld\Desktop\router\test\test_YC1737\yc1737_test20200602_20210902.csv") #YC1737电量过渡季测试20200602_20210902  *可以直接用
    # main(57,"test",r"C:\Users\ld\Desktop\router\test\test_YC1737\yc1737_test20200602_20210902.csv") #YC1737电量过渡季测试20200602_20210902  *可以直接用
    # main(58,"train",r"/data/power_v2/multipower/WEB-INF/classes/static/python/train/train_YC1008/yc1008_train20200602_20210902.csv") #YC1737电量过渡季测试 2021-10-26 至2021-11-27
    # main(58,"test",r"C:\Users\ld\Desktop\python\test\test_YC1008\yc1008_train20200602_20210902.csv") #YC1737电量过渡季测试 2021-10-26 至2021-11-27
    stgy_types = [1001, 1002, 1003]
    try:
        args = sys.argv[1:]
        args[0] = int(args[0])
        for stgy_type in stgy_types:
            args.append(stgy_type)
            main(*args)
            args = args[:-1]
            logging.info("PY_EXECUTE_SUCCESS")
            print("PY_EXECUTE_SUCCESS")
    except Exception as e:
        logging.info("PY_EXECUTE_FAIL")
        print("PY_EXECUTE_FAIL")
        raise e
    # main(157,"test",r"C:\Users\ld\Desktop\python20211231\test\test_YC1008\202112211516.csv") #YC1737电量过渡季测试20200602_20210902  *可以直接用
